﻿using System;
using System.IO;
using System.Collections.ObjectModel;
using System.Xml.Serialization;
using System.Windows;

namespace kostenbuch
{
    class XmlReadWrite
    {
        //XML datei zu Eintragsliste neu
        public static ObservableCollection<Eintrag> readXml(string path, String fileName)
        {
            Eintrag ein = new Eintrag();
            ObservableCollection<Eintrag> list = new ObservableCollection<Eintrag>();
            String fullPath = Path.Combine(path, fileName);
            try
            {
                //pruefen, ob die Datei vorhanden ist
                if (File.Exists(fullPath))
                {
                    //wenn ja, deserialisieren und in einer Collection speichern
                    XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<Eintrag>));
                    using (StreamReader rd = new StreamReader(fullPath))
                    {
                        list = xs.Deserialize(rd) as ObservableCollection<Eintrag>;
                    }
                }
            }
            catch (Exception d)
            {
                Console.Write(d.Message);
                throw;
            }
            return list;
        }
        //Eintragsliste zu XML datei neu
        public static void writeXml(string path, String fileName, ObservableCollection<Eintrag> list)
        {
            try
            {
                //pfad erstellen, falls noch nicht vorhanden
                Directory.CreateDirectory(path);
                //Collection serialisieren und in eine XML-Datei schreiben
                XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<Eintrag>));
                using (StreamWriter wr = new StreamWriter(Path.Combine(path, fileName)))
                {
                    xs.Serialize(wr, list);
                }
            }
            catch (Exception d)
            {
                Console.Write(d.Message);
                MessageBox.Show("Es ist ein Fehler beim speichern der Einträge aufgetreten", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                throw;
            }
        }

        /* alte Methoden zum lesen und schreiben
        public static void writeXml(Eintrag ein)
        {
            string path = "../../myXMl.xml";
            XmlDocument doc = new XmlDocument();
            try
            {
                doc.Load(path);
                XmlNode Node = doc.DocumentElement;

                XmlNode eintrag = doc.CreateNode(XmlNodeType.Element, "eintrag", null);
                XmlNode titel = doc.CreateNode(XmlNodeType.Element, "titel", null);
                titel.InnerText = ein.getTitle();
                XmlNode kategorie = doc.CreateNode(XmlNodeType.Element, "kategorie", null);
                kategorie.InnerText = ein.getKategorie();
                XmlNode notiz = doc.CreateNode(XmlNodeType.Element, "notiz", null);
                if (ein.notiz != "")
                    notiz.InnerText = ein.getNotiz();
                else
                    notiz.InnerText = "";
                XmlNode betrag = doc.CreateNode(XmlNodeType.Element, "betrag", null);
                betrag.InnerText = (ein.getBetrag()).ToString().Replace(',', '.');
                XmlNode monatlich = doc.CreateNode(XmlNodeType.Element, "monatlich", null);
                monatlich.InnerText = (ein.getMonatlich()).ToString();
                XmlNode konto = doc.CreateNode(XmlNodeType.Element, "konto", null);
                konto.InnerText = ein.getKonto();
                XmlNode direction = doc.CreateNode(XmlNodeType.Element, "ausgabe", null);
                direction.InnerText = (ein.getAusgabe()).ToString();
                XmlNode date = doc.CreateNode(XmlNodeType.Element, "datum", null);
                date.InnerText = (ein.getDatum()).ToString();

                Node.AppendChild(eintrag);
                eintrag.AppendChild(titel);
                eintrag.AppendChild(kategorie);
                eintrag.AppendChild(notiz);
                eintrag.AppendChild(betrag);
                eintrag.AppendChild(monatlich);
                eintrag.AppendChild(konto);
                eintrag.AppendChild(direction);
                eintrag.AppendChild(date);

                doc.Save(path);
            }
            catch (Exception d)
            {
                Console.Write(d.Message);
                throw;
            }
        }
         
         //XML datei zu Eintragsliste
        public static ObservableCollection<Eintrag> readXml_old(string path)
        {
            Eintrag ein = new Eintrag();
            ObservableCollection<Eintrag> list = new ObservableCollection<Eintrag>();
            
            try
            {
                XmlReader xmlReader = XmlReader.Create(path);
                String value = "";
                double i = 0;
                DateTime d;
                int year = 0, month = 0, day = 0;
                while (xmlReader.Read())
                {
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "eintrag"))
                    {
                        Console.WriteLine("eintrag");
                        ein = new Eintrag();
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "titel"))
                    {
                        value = xmlReader.ReadElementContentAsString();
                        Console.WriteLine("title: " + value);
                        ein.setTitle(value);
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "kategorie"))
                    {
                        value = xmlReader.ReadElementContentAsString();
                        Console.WriteLine("kategorie: " + value);
                        ein.setKategorie(value);
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "notiz"))
                    {
                        value = xmlReader.ReadElementContentAsString();
                        Console.WriteLine("notiz: " + value);
                        ein.setNotiz(value);
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "betrag"))
                    {
                        i = xmlReader.ReadElementContentAsDouble();
                        Console.WriteLine("betrag: " + i);
                        ein.setBetrag(i);
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "monatlich"))
                    {
                        value = xmlReader.ReadElementContentAsString();
                        Console.WriteLine("monatlich: " + value);
                        if (value.Equals("True"))
                            ein.setMonatlich(true);
                        else
                            ein.setMonatlich(false);
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "konto"))
                    {
                        value = xmlReader.ReadElementContentAsString();
                        Console.WriteLine("konto: " + i);
                        ein.setKonto(value);
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "ausgabe"))
                    {
                        value = xmlReader.ReadElementContentAsString();
                        Console.WriteLine("richtung: " + value);
                        if (value.Equals("True"))
                            ein.setAusgabe(true);
                        else
                            ein.setAusgabe(false);
                    }
                    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "datum"))
                    {
                        value = xmlReader.ReadElementContentAsString();
                        Console.WriteLine("datum: " + value);
                        day = Convert.ToInt32(value.Substring(0, 2));
                        month = Convert.ToInt32(value.Substring(3, 2));
                        year = Convert.ToInt32(value.Substring(6, 4));
                        d = new DateTime(year, month, day);
                        ein.setDatum(d);
                        list.Add(ein);
                    }
                }
            }
            catch (Exception d)
            {
                Console.Write(d.Message);
                throw;
            }
            return list;
        }*/  
    }
}
